from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, declarative_base

# 初始化FastAPI应用
app = FastAPI()

# 添加CORS中间件，允许跨域请求
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 允许所有源
    allow_credentials=True,
    allow_methods=["*"],  # 允许所有HTTP方法
    allow_headers=["*"],  # 允许所有HTTP头部
)

# 数据库配置
# 定义数据库的连接URL
DATABASE_URL = "sqlite:///./province.db"

# 创建数据库引擎，设置连接参数以允许在多线程环境中使用
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})

# 创建一个会话类，用于生成数据库会话
# autocommit设置为False，表示需要手动提交事务
# autoflush设置为False，表示不会自动刷新数据到数据库
# bind参数绑定之前创建的数据库引擎
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建基类
Base = declarative_base()


# 定义省份模型
class Province(Base):
    __tablename__ = "province"
    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, unique=True, index=True)
    code = Column(String)


# 确保表存在
Base.metadata.create_all(bind=engine)


# 实现API接口
@app.get("/api/province")
def get_provinces():
    """
    获取所有省份列表
    返回格式与前端期望的格式一致，包含list属性
    """
    # 创建数据库会话
    db = SessionLocal()
    try:
        # 查询所有省份
        provinces = db.query(Province).all()
        # 提取省份名称列表
        province_list = [province.name for province in provinces]
        # 返回符合前端期望的数据格式
        return {"list": province_list}
    finally:
        # 关闭数据库会话
        db.close()


# 实现城市查询API接口
@app.get("/api/city")
def get_cities(pname: str = None):
    """
    根据省份名称获取城市列表
    参数:
    - pname: 省份名称
    """
    # 这里简化处理，实际应该查询数据库中的城市数据
    # 为演示目的，返回一些示例城市
    cities = {
        "辽宁省": ["沈阳市", "大连市", "鞍山市", "抚顺市", "本溪市"],
        "北京": ["北京市"],
        "上海": ["上海市"],
        "广东省": ["广州市", "深圳市", "珠海市", "汕头市", "佛山市"]
    }
    print("pname:", pname)
    if pname and pname in cities:
        return {"list": cities[pname]}
    return {"list": []}


# 定义请求体模型
class CityRequest(BaseModel):
    pname: str = None


@app.post("/api/city1")
def get_cities(request: CityRequest):
    """
    根据省份名称获取城市列表
    参数:
    - pname: 省份名称
    """
    # 这里简化处理，实际应该查询数据库中的城市数据
    # 为演示目的，返回一些示例城市
    cities = {
        "辽宁省": ["沈阳市", "大连市", "鞍山市", "抚顺市", "本溪市"],
        "北京": ["北京市"],
        "上海": ["上海市"],
        "广东省": ["广州市", "深圳市", "珠海市", "汕头市", "佛山市"]
    }
    print("request:", request)
    # print("pname:", request.pname)
    if request.pname and request.pname in cities:
        return {"list": cities[request.pname]}
    return {"list": []}


@app.post("/api/city2")
def get_cities(request):
    """
    根据省份名称获取城市列表
    参数:
    - pname: 省份名称
    """
    # 这里简化处理，实际应该查询数据库中的城市数据
    # 为演示目的，返回一些示例城市
    cities = {
        "辽宁省": ["沈阳市", "大连市", "鞍山市", "抚顺市", "本溪市"],
        "北京": ["北京市"],
        "上海": ["上海市"],
        "广东省": ["广州市", "深圳市", "珠海市", "汕头市", "佛山市"]
    }
    print("request:", request)
    # print("pname:", request.pname)
    # if request.pname and request.pname in cities:
    #     return {"list": cities[request.pname]}
    # return {"list": []}


# 实现地区查询API接口
@app.get("/api/area")
def get_areas(pname: str = None, cname: str = None):
    """
    根据省份和城市名称获取地区列表
    参数:
    - pname: 省份名称
    - cname: 城市名称
    """
    # 这里简化处理，实际应该查询数据库中的地区数据
    # 为演示目的，返回一些示例地区
    areas = {
        "北京市": ["东城区", "西城区", "朝阳区", "海淀区", "丰台区", "石景山区"],
        "上海市": ["黄浦区", "徐汇区", "长宁区", "静安区", "普陀区", "虹口区"],
        "广州市": ["越秀区", "荔湾区", "海珠区", "天河区", "白云区", "黄埔区"],
        "深圳市": ["福田区", "罗湖区", "南山区", "宝安区", "龙岗区", "盐田区"]
    }

    if cname and cname in areas:
        return {"list": areas[cname]}
    return {"list": []}


# 启动服务器
if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="127.0.0.1", port=8000)
